package org.example.bean;

import org.springframework.beans.factory.ObjectFactory;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;

@Component
public class Girl {

    private Boy boy;
    private ObjectFactory<Boy> boyObjectFactory;


    // 由于Boy和Girl之间存在循环依赖，而且Boy被final修饰，无法为Boy创建代理类，
    // 这种情况下@Lazy注解也无法解决循环依赖
    // public Girl(@Lazy Boy boy){
    //     this.boy = boy;
    // }

    // 但是通过ObjectFactory就可以解决这个问题
    // 这里Spring会为ObjectFactory接口创建一个代理对象，从而使得Girl能够成功构造。
    // Girl成功构造之后，Boy也就可以成功构造了，此时通过这个代理对象的getObject方法就可以获取到boy了
    public Girl(ObjectFactory<Boy> studentObjectFactory) {
        this.boyObjectFactory = studentObjectFactory;
    }

    public Boy getBoy() {
        if(boy == null){
            this.boy = boyObjectFactory.getObject();
        }
        return boy;
    }
}
